﻿// ----------------------------------------------------------------------------------------
// Author:                    Joaquín López y Magally Vargas
// Company:                   Albalia Interactiva S.L
// Assembly version:          1.0.0.0
// Date:                      10/02/2009
// Time:                      12:07
// Solution Name:             FacturaeAdd-in
// Solution Filename:         FacturaeAdd-in.sln
// Solution FullFilename:     C:\Ribbon_Facturae\FacturaeAdd-in.sln
// Project Name:              FacturaeAdd-in
// Project Filename:          FacturaeAdd-in.csproj
// Project FullFilename:      C:\Ribbon_Facturae\FacturaeAdd-in\FacturaeAdd-in.csproj
// Project Item Name:         FrmTimeStampTokenViewer.cs
// Project Item Filename:     FrmTimeStampTokenViewer.cs
// Project Item FullFilename: C:\Ribbon_Facturae\FacturaeAdd-in\FrmTimeStampTokenViewer.cs
// Project Item Kind:         Formulario
// Purpose:                   Mostrar información del sello de tiempo de la firma digital XADES-XL
//Copyright © 2008 - 2009 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------
using Org.BouncyCastle.Tsp;
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography;
using System.Runtime.InteropServices;

namespace FacturaeAdd_in
{
    /// <summary>
    /// Formulario que permite al usuario en el momeno de la validación visualizar los datos
    /// del sello de tiempo de una factura firmada con XADES-XL
    /// </summary>
    public partial class FrmTimeStampTokenViewer : Form
    {
        #region "Fields"

        /// <summary>
        /// Campo de tipo TimeStampToken del cual se extrae toda la información referente al sello de tiempo.
        /// </summary>
        TimeStampToken tst = null;

        #endregion

        #region "Constructors"

        /// <summary>
        /// Constructor que inicializa todos los componentes gráficos del formulario y además el TSTE.
        /// </summary>
        /// <param name="tst">Parámetro de tipo TimeStampToken del cual se extrae toda la información referente al sello de tiempo.</param>
        public FrmTimeStampTokenViewer(TimeStampToken tst)
        {
            InitializeComponent();
            this.tst = tst;

        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que buscar la información asociada al OID que recibe por parámetro.
        /// </summary>
        /// <param name="OID">Parámetro de tipo String que indica el OID del que se quiere obtener información.</param>
        /// <returns>Devuelve un string con toda la informacion asociada al OID.</returns>
        public string OIDName(String OID)
        {
            const uint CRYPT_OID_INFO_OID_KEY = 1;
            IntPtr poidinfo = Win32.CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, OID, 0);
            if (poidinfo == IntPtr.Zero)
                return null;
            CRYPT_OID_INFO coinfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(poidinfo, typeof(CRYPT_OID_INFO));
            return coinfo.pwszName;
        }


        /// <summary>
        /// Método que carga el archivo de idioma y establece los textos de los controles
        /// en el idioma que corresponde.
        /// </summary>
        public void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                this.Text = labels.getLabels(this.Name);
                this.Field.HeaderText = labels.getLabels(this.Field.Name);
                this.Datas.HeaderText = labels.getLabels(this.Datas.Name);
                btnOk.Text = labels.getLabels(btnOk.Name);
                gbxTs.Text = labels.getLabels(gbxTs.Name);

            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        #endregion

        #region "Private Methods"

        /// <summary>
        /// Método que se encarga de mustrar la información del sello de tiempo en un datagrid.
        /// </summary>
        private void displayForm()
        {
            this.dataGridView.Rows.Add("SerialNumber", tst.TimeStampInfo.SerialNumber);
            this.dataGridView.Rows.Add("GenTime (Hora Local)", tst.TimeStampInfo.GenTime.ToLocalTime());
            this.dataGridView.Rows.Add("Policy", tst.TimeStampInfo.Policy);
            this.dataGridView.Rows.Add("MessageImprint OID", tst.TimeStampInfo.MessageImprintAlgOid + " - " + OIDName(tst.TimeStampInfo.MessageImprintAlgOid));
            string TSTmessageImprint = Convert.ToBase64String(tst.TimeStampInfo.GetMessageImprintDigest());
            this.dataGridView.Rows.Add("MessageImprint", TSTmessageImprint);
            this.dataGridView.Rows.Add("Accuracy", tst.TimeStampInfo.Accuracy);
            this.dataGridView.Rows.Add("GenTimeAccuracy", tst.TimeStampInfo.GenTimeAccuracy);
            this.dataGridView.Rows.Add("IsOrdered", tst.TimeStampInfo.IsOrdered);
            this.dataGridView.Rows.Add("Nonce", tst.TimeStampInfo.Nonce);
            this.dataGridView.Rows.Add("TSA", tst.TimeStampInfo.Tsa);
            this.dataGridView.Rows[4].DefaultCellStyle.BackColor = Color.GreenYellow;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al mostrarse el formulario.
        /// Carga el idioma y despues muestra los datos del sello de tiempo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmTimeStampTokenViewer_Load(object sender, EventArgs e)
        {
            LoadLanguage();
            displayForm();
        }

        #endregion

        #region "EventHandler"


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el boton de Aceptar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        #endregion



    }

    #region "Clases Internas"

    /// <summary>
    /// 
    /// </summary>
    class Win32
    {
        [DllImport("crypt32.dll", SetLastError = true)]
        public static extern IntPtr CryptFindOIDInfo(
        uint dwKeyType,
        [MarshalAs(UnmanagedType.LPStr)] String szOID,
        uint dwGroupId);
    }

    #endregion


    #region "Structures"

    /// <summary>
    /// 
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct CRYPT_OID_INFO
    {
        /// <summary>
        /// 
        /// </summary>
        public uint cbSize;
        /// <summary>
        /// 
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String pszOID;
        /// <summary>
        /// 
        /// </summary>
        [MarshalAs(UnmanagedType.LPWStr)]
        public String pwszName;
        /// <summary>
        /// 
        /// </summary>
        public uint dwGroupID;
        /// <summary>
        /// 
        /// </summary>
        public uint dwValue;
        /// <summary>
        /// 
        /// </summary>
        public int cbData; 
        /// <summary>
        /// 
        /// </summary>
        public IntPtr pbData;
    }

    #endregion

}
